package com.wsx.ones.monitor.core.exec.push;

import com.google.common.reflect.Reflection;
import com.wsx.ones.monitor.common.system.SystemConfig;
import com.wsx.ones.monitor.core.loader.RpcClientLoader;

/**
 * 客户端发送消息的操作类
 *
 * PushExecuter executer = new PushExecuter("hession:127.0.0.1:6770");
 * TestInterface test = executer.execute(TestInterface.class);
 * int value = test.add(i, 5);
 * System.out.println(i + " + 5 = " + value);
 *
 *
 * Created by wangshuaixin on 17/2/4.
 */
public class PushExecuter {

    //加载器是单例的，暂时单个应用只支持单个协议，不能混合使用协议
    private RpcClientLoader rpcClientLoader = RpcClientLoader.getInstance();


    /**
     * 默认构造使用默认的参数配置
     */
    public PushExecuter() {
        this(SystemConfig.DEFAULT_URL);
    }

    /**
     * 调用方法之前，需要确定的是使用的那个服务提供的链接地址和协议
     * @param inetAddress
     * 参数描述，第一个是序列化的标示，第二个是服务端的ip，第三个为服务端暴露的端口
     */
    public PushExecuter(String inetAddress) {
        rpcClientLoader.init(inetAddress);
    }

    /**
     * 停止客户端的工作
     * 该功能主要是针对客户端程序关闭时调用，保证netty客户端同时关闭
     */
    public void stop() {
        rpcClientLoader.close();
    }

    /**
     * 方法的主要执行者，通过动态代理来实现rpc的通信
     * @param rpcInterface
     * @param <T>
     * @return
     */
    public <T> T execute(Class<T> rpcInterface) {
        return Reflection.newProxy(rpcInterface, new PushProxy<T>());
    }
}
